<?php
namespace app\admin\controller;
use app\admin\model\Category as cate;
use think\Db;
use think\Config;    //引用模块配置

class Category extends Authentication
{

    //==========================
    //单个及多个栏目删除前置方法
    //==========================
    protected $beforeActionList = [
        'children_delete' => ['only'=>'delete'],
        'batch_children_delete' => ['only'=>'batch_delete'],
    ];

    /**
     * 栏目分类列表
     * @return string 分类列表模板
     */
    public function index()
    {
        //加载模块配置:默认分页条数
        define("PAGINATE_NUM",config('DEFAULT_PAGINATE_NUM'));
        
        //查询数据库,根据ID升序排列
        $res = Db::name('category')->order('id asc')->paginate(PAGINATE_NUM);
        
        //模板参数变量赋值
        $this->assign('CATEGORYS',$res);
        return $this->fetch();
    }

    /**
     * 栏目分类添加
     * @return string 分类列表模板
     */
    public function insert()
    {
        //========================
        //以下处理栏目新增页面提交
        //========================
        
        //判断表单是否Post传值
        if(request()->isPost()){
          
          $data=[
            "name"    =>input("name"),
            "name_cn" =>input("name_cn"),
            "keywords"=>input("keywords"),
            "desc"    =>input("desc"),
            "parent_id"=>input("parent_id"),
            "create_time"=>date("Y-m-d H:i:s",time()),
            "update_time"=>date("Y-m-d H:i:s",time()),
          ];
          
          //按照规则实例化验证器
          $validate = \think\Loader::validate('Category');
          
          //验证器验证待插入数据
          if($validate->check($data)){
            
            //插入数据            
            $db = Db::name('category')->insert($data);
            
            //判断插入结果            
            if($db){
              return $this->success("栏目添加成功!",url('Category/index'));
            }else{
              return $this->error("栏目添加失败!",url('Category/index'));
            }    
          }else{
            return $this->error($validate->getError());
          }
        }
        
        //========================
        //以下处理栏目新增页面加载
        //========================
        
        //实例化模型层对象
        $category = new cate;
        
        //新增方式查询所有栏目分类
        $menu = $category->displayCate(0,0,true);
        
        //模板参数变量赋值
        $this->assign('CATEGORY_MENU',$menu);
        
        //加载栏目新增页面
        return $this->fetch('insert');

    }
    //==============
    //删除方法(单个)
    //==============
    public function delete()
    {
        //判断表单是否Get传值
        if(request()->isGet()){
          $id = input('id');
          
          //首先判断该栏目是否为空
          if(!$this->isEmptyCate($id)){
            
            //如果栏目非空则将待栏目下的所有文章(包括子栏目文章)的分类修改为未分类
            if($this->uncategory($id)){
                
                //修改栏目分类成功之后删除该子栏目
                if(Db::name('category')->delete($id)){
                  return $this->success("栏目删除成功!",url('Category/index'));
                }else{
                   return $this->error("栏目删除失败!",url('Category/index'));
                }
            }else{
                return $this->error("栏目修改失败!",url('Category/index'));
            }
          }else{
            //如果栏目为空通过主键删除栏目
            if(Db::name('category')->delete($id)){
              //return $this->success("栏目删除成功!",url('Category/index'));
              show(1, "栏目删除成功!");
            }else{
              //return $this->error("栏目删除失败!",url('Category/index'));
              show(0, "栏目删除失败!");
            }
          }
        }
    }
    //==============
    //删除方法(批量)
    //==============
    public function batch_delete()
    {
        //判断表单是否Post传值
        if(request()->isPost()){
          
          //获取提交参数
          $ids =\think\Request::instance()->param('id'); 
          
          //判断参数是否为空
          if(empty($ids)){
            return $this->error("未选择内容");
          }
          
          //期间错误记录数组
          $errors = array();
          
          //遍历删除
          foreach($ids as $key=>$id){
            
            //首先判断该栏目是否为空
            if(!$this->isEmptyCate($id)){
              
              //如果栏目非空则将栏目下的所有文章(包括子栏目文章)分类修改为未分类
              if($this->uncategory($id)){

                //分类修改成功后,删除该栏目
                $res = Db::name('category')->delete($id);
                if(false==$res){
                  $errors[]=$id;
                }
              }else{
                $errors[]=$id;
              }
            }else{
                //如果栏目为空,通过主键删除栏目
                $res = Db::name('category')->delete($id);
                if(false==$res){
                  $errors[]=$id;
                }
              }
          }
          //根据结果返回判断
          if($errors){
            $msg = implode(',',$errors);
            return $this->error("栏目批量删除失败!".$msg,url('Category/index'));
          }else{
            return $this->success("栏目批量删除成功!",url('Category/index'));
          }
        }
    }
    //===========================
    //私有函数: 获取子栏目分类ID
    //===========================
    private function getChildrenID($pid){
      
      //定义静态返回栏目ID数组
      static $return = array();
      
      //根据$pid查询
      $result = Db::name('category')->where('parent_id','eq',$pid)->select();
      
      foreach($result as $key=>$value){
        //元素入栈
        $return[]=$value['id'];

        //迭代搜索
        $this->getChildrenID($value['id']);
      }
      //返回栏目ID数组
      return $return;
    }

    //===============================
    //公有函数:删除某栏目下所有子栏目
    //===============================
    public function children_delete($pid=NULL){

        //判断表单Get传参
        if(NULL!=$pid){
          $id = $pid;
        }elseif(request()->isGet()){
          $id = input('id');
        }
        $child_array = $this->getChildrenID($id);
        
        //子分类非空判断
        if(empty($child_array))return;
        
        //期间错误记录
        $errors = array();
          
        foreach($child_array as $key=>$child_id){
          
          //判断欲删除栏目下是否有相应文章
          if(!$this->isEmptyCate($child_id)){
            
            //将待删除文章栏目下的所有文章(包括子栏目下的)的分类修改为未分类
            if($this->uncategory($child_id)){
                
                //修改栏目文章分类成功之后删除该子栏目
                $res = Db::name('category')->delete($child_id);
                if(false==$res) $errors[]=$id;
            }
          }else{
                //如果子栏目为空可直接删除
                $res = Db::name('category')->delete($child_id);
                if(false==$res) $errors[]=$id;
          }
        }
        //根据处理结果返回判断
        if($errors){
          $msg = implode(',',$errors);
          return $this->error("子栏目批量删除失败!".$msg,url('Category/index'));
        }else{
          return $this->success("子栏目批量删除成功!",url('Category/index'));
        }
    }
    //=====================================
    //公有函数:批量删除所选栏目下所有子栏目
    //=====================================
    public function batch_children_delete(){

        //判断表单Post传值
        if(request()->isPost()){
          $id =\think\Request::instance()->param('id'); //待删除栏目ID数组

          //判断参数是否为空
          if(!empty($id)){
            
            //逐一删除子栏目及修改其文章分类
            foreach($id as $key=>$cid){
              $this->children_delete($cid);
            }
          }
        }
    }
    //=========================================
    //私有函数:判断欲删除栏目的下是否有相应文章
    //=========================================
    private function isEmptyCate($cat_id){
      if(\think\Db::table('tp_article')->where('category','eq',$cat_id)->select()){
        return false;
      }else{
        return true;
      }
    }
    //===========================================
    //私有函数:将待删除栏目下所有文章修改为未分类
    //===========================================
    private function uncategory($id){
        $res = Db::name('article')
              ->where('category', $id)
              ->update(['category' => -1]);
        if($res>0){
          return true;
        }else{
          return false;
        }
    }
    //============
    //栏目编辑方法
    //============
    public function edit()
    {
        //判断表单是否Get传值
        if(request()->isPost()){
          
          $id = input('id');
          
          //获取栏目更新数据
          $data = [
            'name'=>input('name'),
            'name_cn'=>input('name_cn'),
            'keywords'=>input('keywords'),
            'desc'=>input('desc'),
            "parent_id"=>input("parent_id"),
            'update_time'=>date("Y-m-d H:i:s",time()),
          ];
          
          //按照规则实例化验证器
          $validate = \think\Loader::validate('Category');
          
          //验证器以编辑场景验证待更新数据
          if($validate->scene('edit')->check($data)){
            
            $res = Db::name('category')
                    ->where('id', $id)
                    ->update($data);
            
            // 判断更新结果        
            if($res){
              return $this->success("栏目更新成功! ","../../index");
            }else{
               return $this->error("栏目更新失败! ");
            }
          }else{
            return $this->error($validate->getError());
          }
        }    
        //判断表单是否Get传值
        if(request()->isGet()){
          
          //获取栏目ID
          $id = input('id');
          
          //助手函数查询栏目记录
          $record = db('category')->where('id',$id)->find();
          $this->assign('record',$record);
          
          //实例化模型层对象
          $category = new cate;
          
          //查询所有分类
          $menu = $category->displayCate(0,$record["parent_id"],true);
          
          //模板参数变量替换
          $this->assign('CATEGORY_MENU',$menu);
        
          //更新页面加载
          return $this->fetch('edit');          
        }
    }
}